<!DOCTYPE HTML>
<html>
<head>
<meta http-equiv="Content-type" content="text/html; charset=utf-8">
<title>Boomerang の測定方法</title>
<link rel="stylesheet" type="text/css" href="../boomerang-docs.css">
</head>
<body>
<span style="float:right;"><a href="./">ドキュメント一覧</a></span>
<h1>どのように動作するか</h1>

<h2>1. 往復測定（Round trip）</h2>
<p>
私たちはユーザーがリソースにリクエストを始めてから、そのリソースがユーザーにとって完全に有効になるまでの時間を往復（round trip）時間として定義します。私たちが測定できるものは HTML ページのリソースでなおかつ、私たちがコントロールできるページ上からのクリックまたは画面遷移によってリクエストされたリソースに限ります。
</p>
<p>
往復時間はしたがって、リンクをユーザーがクリックしてからユーザーによってページが参照されるまでの時間となります。多くの場合、これは前のページの onbeforeunload イベントが発生してから現在のページの onload イベントが発生するまでを測定すれば問題ありません。いくつかのケースでは違うかもしれませんが、私たちはこれらのイベントを開発者が決められるようにします。
</p>
<p>
どのように測定するか。
</p>
<ul>
<li>
<p>
<code>window.onbeforeunload</code> イベントに関数をアタッチする。
</p>
<p>
この関数で時間（ms）を取得し、現在のページの URL と一緒にセッション Cookie に保存します。
</p>
</li>
<li>
<p>
<code>window.onload</code> イベントに関数をアタッチする。
</p>
<p>
この関数で時間（ms）を取得し、前のページの onbeforeunload イベントハンドラーで保存された Cookie を探します。もし Cookie が見つからずブラウザーが <a href="http://dev.w3.org/2006/webapi/WebTiming/">WebTiming</a> API を実装しているか検証します。もし WebTiming API を実装していればそこからのデータを使うようにします。どちらも見つからなければそこで終了します <a href="#fn-1" class="fn">[1]</a> 。
</p>
<p>
もし Cookie が見つかった場合、Cookie の中に保存された URL と現在のページの <code>document.referrer</code> を検証します。もしこのふたつが違った場合、ユーザーが二つのページの間で三つ目のページに訪れたかもしれないため測定は失敗し、そこで終了します <a href="#fn-2" class="fn">[2]</a> 。
</p>
<p>
もしここまで実行できていれば、Cookie から時間を取り出して Cookie を削除します。二つの時間の差を測定し、これがページの往復（Round trip）時間となります。
</p>
</li>
</ul>



<h2>2. 帯域幅と遅延の測定</h2>
<p>
帯域幅と遅延はサーバー上の固定サイズの画像のダウンロードとそれらをダウンロードするためにかかった時間によって測定します。次のようにして実行します:
</p>
<ul>
<li>
<p>
最初に 32 byte の GIF を10回続けてダウンロードします。これを遅延の測定に使用します。
</p>
<p>
1回目の測定結果は TCP のハンドシェイク（3パケット）と TCP のスロースタート（4パケット以上）を消費するため破棄します。他の全ての画像のリクエストは TCP の2パケット（リクエストの1パケットとレスポンスの1パケット）を消費します。これはブラウザーからサーバーへの HTTP リクエストにどれくらい時間がかかっているかの良い目安になります。
</p>
<p>
それが済むと平均値を計算し、9回のダウンロードによって得られた標準偏差と標準誤差は95%信頼できる値となります。これがビーコンによってサーバーから返ってきた遅延の値になります。
</p>
</li>

<li>
<p>
次はタイムアウトが発生するまで画像のサイズを大きくしていきダウンロードします。
</p>
<p>
できるだけ早く帯域幅の範囲で画像のサイズを絞り込みます。詳しいことは <a href="../../boomerang.js">boomerang.js</a> のコメントをご覧ください。
</p>
<p>
画像のタイムアウトを1.2秒から1.5秒の間に設定します。もしタイムアウトした場合、それより大きい画像のダウンロードをやめて、その時点で最も大きい画像のダウンロードを4回以上試します <a href="#fn-3" class="fn">[3]</a> 。ダウンロードした最も大きい画像3つから帯域幅を計算します。
それよりも前にタイムアウトしない限りこれによって7つの結果が得られるはずです <a href="#fn-4" class="fn">[4]</a> 。中間値を計算し、これらの値から得られた標準偏差と標準誤差がビーコンによってサーバーから帰ってきた帯域幅になります。
</p>
</li>
</ul>

<p class="perma-link">
最新のソースコードとドキュメントは <a href="http://github.com/lognormal/boomerang/">github.com/lognormal/boomerang</a> に公開されています。
</p>

<div id="footnotes">
<h2>注釈:</h2>
<ol>
<li id="fn-1">
実際はこの時点で中断しますが、自分で設定した開始時間によって補助できるような機能があります。これは全ページの読み込み時間を測定していないときにはとても便利ですが、いくつかの読み込み時間は JavaScript による動的なものかもしれません。
</li>
<li id="fn-2">
この時点では中断しないようにできる機能を用意していますが、むしろバックエンドに全ての URL を渡して、ビーコンを破棄するかどうかをサーバー側で決められるようにしています。これは SSL 上のログイン画面があるサイトでは便利ですし、ユーザーがリンクをクリックしてログイン画面へ遷移する場合も考えられます。このケースではリファラーがあるかもしれないし、ないかもしれません。
</li>
<li id="fn-3">
この値は <code>BW.nruns</code> パラメーターを使って設定できます。boomerang の詳しい設定は <a href="howtos/howto-6.html">Howto #6</a> をご覧ください。
</li>
<li id="fn-4">
帯域幅のテストは15秒後にタイムアウトします。この時点で既に集めたデータをもとに帯域幅を決めます。
</li>
</ol>
</div>
</body>
</html>
<!--
    Copyright (c) 2011, Yahoo! Inc.  All rights reserved.
    Copyrights licensed under the BSD License. See the accompanying LICENSE.txt file for terms.
-->
